﻿#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;

/*
动态对象创建：
当我们创建数组的时候，总是需要提前预定数组的长度，然后编译器分配预定长度的数组空间，在使用数组时，会有这样的问题，
数组也许空间太大了，浪费空间，也许空间不足，所以对于数组来讲，如果能根据需要来分配空间大小再好不过。
所以动态的意思意味着不确定性。
为了解决这个普遍问题，在运行中可以创建和销毁对象是最基本的要求。当然c早就提供了动态内存分配（dynamic memory 
allocation），函数malloc和free可以在运行时从堆中分配存储单元。
*/

class Maker {
public:
	Maker() {
		cout << "构造函数" << endl;
	}

	Maker(int n) {
		cout << "有参构造函数" << endl;
	}

	~Maker() {
		cout << "析构函数" << endl;
	}
};

void test01() {
	// 用C语言方式申请堆空间，存在几个问题：
	// 1. 对象释放时不会调用析构函数 
	// 2. 申请空间时需要确定对象长度
	// 3. 返回void指针，需要强制类型转化
	// 4. malloc可能申请内存失败，需要判断返回值是否为NULL
	// 5. 用户使用对象前必须手动初始化，不会自动调用构造函数 
	Maker *m = (Maker *)malloc(sizeof(Maker));
	if (m != NULL) {
		free(m);
	}
}

void test02() {
	// 鉴于C语言malloc动态创建对象的问题，引入了c++的new操作符分配对象 
	// 使用new操作符会调用构造函数 
	Maker *m = new Maker;
	// 使用delete操作符会调用析构函数 
	delete m;
	m = NULL;

	Maker *m1 = new Maker(10);
	delete m1;
	m1 = NULL; 
}

int main()
{

	// test01();
	test02();

	system("pause");
	return EXIT_SUCCESS;
}